import org.junit.Test;

import java.util.Comparator;
import java.util.function.*;

/**
 * @author： pang-yun
 * @date： 2021-10-26 15:07
 * 功能目的 ：用于
 */

public class MethodRef {

    //对象 ：： 实例方法名
    @Test
    public void a() {
        Consumer<Integer> con = System.out::println;
        con.accept(3);
    }

    //  对象 ： 实例方法名
    @Test
    public void b() {
        Person pang = new Person("pang", 23);
        Supplier<String> supplier = () -> pang.getName();
        String s = supplier.get();
        System.out.println(s);


        Supplier<String> sup = pang::getName;
        System.out.println(sup.get());
    }

    // -------------------------类 : 静态方法名-----------------
    // 静态方法 的 输入值  返回值   应该与 函数式 接口 的 输入值与 返回值 一致 才可以使用 lambda 表达式
    @Test
    public void c() {
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
        Comparator<Integer> com = Integer::compareTo;
        System.out.println(com.compare(1, 2));
    }


    // ---------------------类 ：：实例方法-----------
    @Test
    public void d() {
        // 传入的 第一个参数 是 方法的调用者  传入的第二个参数 是 方法的参数 就可以使用 类：： 实例方法
        BiPredicate<String, String> predicate = (x, y) -> x.equals(y);

        BiPredicate<Integer, Integer> biPredicate = Integer::equals;

    }

    //-------------------构造器引用----------

    @Test
    public void e() {
        // 自动匹配 对象的构造器  因为 supplier 没有 输入参数  得到的是 无参构造器
        Supplier<Person> supplier = Person::new;
        System.out.println(supplier.get());

        // 这次调用的是 一个参数的person 构造器
        Function<String,Person> function =Person::new;
        System.out.println(function.apply("pang"));

        // 这次调用的是 两个参数的构造器  返回的是 一个 person 对象
        BiFunction<String,Integer,Person> func=Person::new;
        System.out.println(func.apply("chao", 34));
    }


    //-----------------数组引用---------
    @Test
    public void f(){
        Function<Integer,String []> function= x-> new String[x];

        // 传入长度 创建 新的 数组对象
        Function<Integer,String[]> func = String[]::new;
        System.out.println(func.apply(5).length);
    }
}
